package main

import (
	"fmt"
)

type myint int

//1.斐波那契数
func fbn(n int) int {
	if n == 1 || n == 2 {
		return 1
	} else {
		return fbn(n-1) + fbn(n-2)
	}
}

//2.猴吃桃递归
func hct(n int) int {
	if n == 10 {
		return 1
	} else {
		return (hct(n+1) + 1) * 2
	}
}

//3.多参数数组
func dcs(args ...string) { //args 是一个保存了多个参数的切片
	for index, val := range args {
		fmt.Printf("args[%d] : [%s]\n", index, val)
	}
}

//4.通过地址符，可以在函数更改main函数的数据
func pointchange(str *string) {
	*str = "I love you"
	fmt.Println(*str)
}

//5.函数也是一种数据类型
func getSum(num1 int, num2 int) (sum int) {
	sum = num1 + num2
	return
}

//6.可以返回多个值，如果不需要其中一个用 _ 来忽略
func getRes(num1 int, num2 int) (sum int, sub int) {
	sum = num1 + num2
	sub = num1 - num2
	return
}

func main() {
	//1...
	res := fbn(6)
	fmt.Println("fbn:  ", res)

	//2...
	number := hct(1)
	fmt.Printf("一共有%v个桃子\n\n", number)

	//3...
	dcs("fmx", "hello", "world", "我爱世界")

	//4...
	var str string = "Hello World"
	pointchange(&str)
	fmt.Println(str)

	//5...
	function := getSum
	fmt.Printf("The function type is ：%T\n", function)
	sum := function(10, 20)
	fmt.Println("The Sum : ", sum)

	//6...
	sum, _ = getRes(10, 100) //  _ 用来忽略某一个返回值
	fmt.Println("The Sum2 : ", sum)

	//类型重命名
	var t int
	var n myint
	n = 100
	t = int(n)
	fmt.Println("重命名后:", n, "=====", t)
}
